Skip to content

9.1 入门简要

9.1.1 入门准备

入门条件对 EF/EFCore 有一定基础了解,还未接触的可先看 【EFCore 基础】

9.1.1.1 安装对应数据库包

tip在本章节所在的类别中,所有数据库操作功能均需要依赖 EntityFramework Core 框架,但 Furion 框架底层并未集成 EntityFramework Core 包,而是采用动态加载程序集方式自动载入。

所以,如需使用本大类数据库功能,需安装对应的 EntityFramework Core 数据库包:

  • SqlServerMicrosoft.EntityFrameworkCore.SqlServer (支持 SqlServer 2005 +)
  • SqliteMicrosoft.EntityFrameworkCore.Sqlite
  • CosmosMicrosoft.EntityFrameworkCore.Cosmos
  • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
  • MySql
    • Pomelo.EntityFrameworkCore.MySql:(支持 MySql 5.x +)
    • MySql.EntityFrameworkCore:支持 (MySql 8.x +)
  • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
  • OracleOracle.EntityFrameworkCore (支持 Oracle 10 +)
  • FirebirdFirebirdSql.EntityFrameworkCore.Firebird
  • DmMicrosoft.EntityFrameworkCore.Dm

小知识这些数据库包应该安装在 YourProject.EntityFramework.Core 层。特殊情况需安装在 YourProject.Core 层中,如 Mysql HasCharset() 配置。

9.1.1.2 创建数据库上下文

using Furion.DatabaseAccessor;  
using Microsoft.EntityFrameworkCore;  

namespace Furion.EntityFramework.Core  
{  
    [AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]  
    public class DefaultDbContext : AppDbContext<DefaultDbContext>  
    {  
        public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)  
        {  
        }  
    }  
}  

特别注意每一个数据库上下文都需继承 AppDbContext<TDbContext, TDbContextLocator> 基类,默认数据库的 TDbContextLocatorMasterDbContextLocator,无需显式编写。

非默认数据库则需显式继承并申明,如:AppDbContext<OtherDbContext, OtherDbContextLocator>

想了解更多可查阅 【数据库上下文定位器】 章节。

9.1.1.3 配置连接字符串

Furion 框架提供多种方式配置数据库连接字符串:

  • appsettings.json 中配置
{  
  "ConnectionStrings": {  
    "Sqlite3ConnectionString": "Data Source=./Furion.db"  
  }  
}  

  • 自定义 .json 文件配置
{  
  "ConnectionStrings": {  
    "Sqlite3ConnectionString": "Data Source=./Furion.db"  
  }  
}  

该方式和在 appsettings.json 的区别是自定义的 .json 文件不会自动添加到项目中,须在 Visual Studio 中配置 .json 右键属性,设置 复制 输出目录为 如果较新则复制,生成操作为:内容

  • [AppDbContext] 特性配置
[AppDbContext("Data Source=./Furion.db", DbProvider.Sqlite)]  
public class DefaultDbContext : AppDbContext<DefaultDbContext>  
{  
}  

  • 在注册上下文时配置
services.AddDatabaseAccessor(options =>  
{  
    // options.AddDb<DefaultDbContext>(connectionMetadata: "配置Key或连接字符串");  
    options.AddDbPool<DefaultDbContext>(connectionMetadata: "配置Key或连接字符串");  
});  

  • DbContext 中配置
using Furion.DatabaseAccessor;  
using Microsoft.EntityFrameworkCore;  

namespace Furion.EntityFramework.Core  
{  
    public class DefaultDbContext : AppDbContext<DefaultDbContext>  
    {  
        public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)  
        {  
        }  

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)  
        {  
            optionsBuilder.UseSqlite("连接字符串");  
            base.OnConfiguring(optionsBuilder);  
        }  
    }  
}  

9.1.1.4 各类数据库连接字符串配置示例

  • SqliteData Source=./Furion.db
  • MySqlData Source=localhost;Database=Furion;User ID=root;Password=000000;pooling=true;port=3306;sslmode=none;CharSet=utf8;
  • SqlServerServer=localhost;Database=Furion;User=sa;Password=000000;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;
  • OracleUser Id=orcl;Password=orcl;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))
  • PostgreSQLPORT=5432;DATABASE=postgres;HOST=127.0.0.1;PASSWORD=postgres;USER ID=postgres;

9.1.1.5 注册数据库上下文

Furion.EntityFramework.Core\Startup.cs

using Furion.DependencyInjection;  
using Microsoft.Extensions.DependencyInjection;  

namespace Furion.EntityFramework.Core  
{  
    [AppStartup(600)]  
    public sealed class FurEntityFrameworkCoreStartup : AppStartup  
    {  
        public void ConfigureServices(IServiceCollection services)  
        {  
            // 配置数据库上下文,支持N个数据库  
            services.AddDatabaseAccessor(options =>  
            {  
                // 配置默认数据库  
                options.AddDbPool<DefaultDbContext>();  

                // 配置多个数据库,多个数据库必须指定数据库上下文定位器  
               //  options.AddDbPool<SqliteDbContext, SqliteDbContextLocaotr>();  
            });  
        }  
    }  
}  

了解更多数据库数据库注册方式如需了解各种数据库及版本注册方式可查阅 【9.19 多数据库注册章节

9.1.1.6 Code First 说明

特别注意Furion 框架默认数据迁移的程序集为:Furion.Database.Migrations,所以如果您改了程序集名称或通过 NuGet 方式安装的 Furion 包,则需要配置迁移程序集名称:

services.AddDatabaseAccessor(options =>  
{  
    options.AddDbPool<DefaultDbContext>(DbProvider.Sqlite);  
}, "存放迁移文件的项目名称");  

另外,如果应用中配置了多个数据库上下文,那么所有的 迁移命令 都需要指定 -Context 数据库上下文名称 参数。如:

Add-Migration v1.0.0 -Context DefaultDbContext  

9.1.2 反馈与建议

与我们交流给 Furion 提 Issue